/*
 * indexManager.h
 *
 */

#ifndef INDEXMANAGER_H_
#define INDEXMANAGER_H_

#include "../Entities/User.h"
#include "../Entities/Service.h"
#include "../Entities/Query.h"
#include "../Entities/Category.h"
#include <vector>

#define BLOCK_SIZE 1024
#define CAPACITY 0.7f

#define IDENTIFICACIONES_USUARIOS "ids_usuarios"

#define HASH_USERS "hash_user"
#define HASH_SERVICES "hash_servicios"
#define HASH_QUERIES "hash_queries"
#define BMAS_TIPO "bmas_tipo"
#define BMAS_PROVINCIA "bmas_provincia"
#define BMAS_CATEGORIA "bmas_categoria"
#define BMAS_IDSERVICIO_IDUSUARIO "bmas_idServicio_idUsuario"
#define BMAS_IDSERVICIO_FECHA_HORA_ "bmas_idServicio_fecha_hora"

class indexManager {
public:
	indexManager();
	virtual ~indexManager();

	bool agregarID(const String& name, const String& pass, BigInt id);
	bool recuperarID(const String& name, const String& pass, BigInt id);
	bool eliminarID(const String& name, const String& pass);

	bool agregarAlHash(const User& nuevo);
	bool agregarAlHash(const Service& nuevo);
	bool agregarAlHash(const Query& nuevo);

	bool eliminarDelHashUsuario(BigInt id);
	bool eliminarDelHashServicio(BigInt id);
	bool eliminarDelHashConsulta(BigInt id);

	bool recuperarDelHash(BigInt id, User& recuperado);
	bool recuperarDelHash(BigInt id, Service& recuperado);
	bool recuperarDelHash(BigInt id, Query& recuperado);

	bool agregarAlIndiceTipoUsuario(const User& nuevo);
	bool agregarAlIndiceProvincia(const User& nuevo);
	bool agregarAlIndiceNombreCategoria(const Service& nuevo);
	bool agregarAlIndiceIDservicioIDusuario(const Service& nuevo);
	bool agregarAlIndiceIDservicioFechaYHoraConsulta(const Query& nuevo);
	bool agregarAlIndiceDescripcion(const Category& nueva);
	bool agregarAlIndiceDescripcion(const Service& nuevo);
	bool agregarAlIndiceConsulta(const Query& nueva);

	bool eliminarDelIndiceTipoUsuario(char tipo, BigInt id);
	bool eliminarDelIndiceProvincia(const String& provincia, BigInt id);
	bool eliminarDelIndiceNombreCategoria(const String& categoria, BigInt id);
	bool eliminarDelIndiceIDservicioIDusuario(BigInt idServicio, BigInt idUsuario, BigInt id);
	bool eliminarDelIndiceIDservicioFechaYHoraConsulta(BigInt idServicio, const String& fecha, const String& hora, BigInt id);
	bool eliminarDelIndiceDescripcionCategoria(BigInt id);
	bool eliminarDelIndiceDescripcionServicio(BigInt id);
	bool eliminarDelIndiceDescripcionConsulta(BigInt id);

	bool recuperarDelIndiceTipoUsuario(const String& tipo, std::vector<BigInt>& ids);
	bool recuperarDelIndiceProvincia(const String& provincia, std::vector<BigInt>& ids);
	bool recuperarDelIndiceNombreCategoria(const String& categoria, std::vector<BigInt>& ids);
	bool recuperarDelIndiceIDservicioIDusuario(BigInt idServicio, BigInt idUsuario, std::vector<BigInt>& ids);
	bool recuperarDelIndiceIDservicioFechaYHoraConsulta(BigInt idServicio, const String& fecha, const String& hora, std::vector<BigInt>& id);
	bool recuperarDocumentosDeConsulta(const String&  entidad, const String& consulta, std::vector<BigInt>& ids);

private:

};

#endif /* INDEXMANAGER_H_ */
